package com.kding.deviceunique.utils;

import android.content.Context;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;

import com.kding.deviceunique.Constants;
import com.kding.deviceunique.UUIDUtils;

import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 关键管理
 * 这里文件管理比较简单只处理了文件创建以及文件列表获取
 */
public class FileUtil {
    public final static String TAG = "UUID";
    private static FileUtil fileUtil;

    private FileUtil() {

    }

    public static synchronized FileUtil getInstance() {
        if (fileUtil == null) {
            fileUtil = new FileUtil();
        }
        return fileUtil;
    }

    //获取sdcard目录
    private static String getSDPath(Context context) {
        File sdDir = null;
        boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);// 判断sd卡是否存在
        if (sdCardExist) {
            //target >30 已经废弃了,
//            if (android.os.Build.VERSION.SDK_INT < 29) {
//                sdDir = Environment.getExternalStorageDirectory();// 获取跟目录
//            } else {
                sdDir = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);// 获取应用内置外部存储,用户清楚或者删除的时候数据清除
//            }
        } else {
            sdDir = Environment.getDataDirectory().getParentFile();
        }
        Log.d(UUIDUtils.TAG, "fileName ===》1111" + (sdDir != null ? sdDir.toString() : ""));
        return sdDir != null ? sdDir.toString() : "";
    }

    //创建目录，不限目录层级
    private static String mkdirs(Context context, String path) {
        String sdcard = getSDPath(context);
        if (TextUtils.isEmpty(sdcard)) {
            return null;
        }
        if (!path.contains(sdcard)) {
            path = sdcard + (path.indexOf("/") == 0 ? "" : "/") + path;
        }
        File destDir = new File(path);
        if (!destDir.exists()) {
            path = makedir(context, path);
        }
        Log.d(UUIDUtils.TAG, "fileName ===》" + path);
        return path;
    }

    private static String makedir(Context context, String path) {
        String sdPath = getSDPath(context);
        if (TextUtils.isEmpty(sdPath)) {
            return null;
        }
        String[] dirs = path.replace(sdPath, "").split("/");
        StringBuilder filePath = new StringBuilder(sdPath);
        for (String dir : dirs) {
            if (!"".equals(dir) && !dir.equals(sdPath)) {
                filePath.append("/").append(dir);
                File destDir = new File(filePath.toString());
                if (!destDir.exists()) {
                    boolean b = destDir.mkdirs();
                    if (!b) {
                        return null;
                    }
                }
            }
        }
        return filePath.toString();
    }


    private static List<String> getFilesAllName(Context context, String path) {
        String sdcard = getSDPath(context);
        if (TextUtils.isEmpty(sdcard)) {
            return null;
        }
        if (!path.contains(sdcard)) {
            path = sdcard + (path.indexOf("/") == 0 ? "" : "/") + path;
        }
        File file = new File(path);
        File[] files = file.listFiles();
        if (files == null) {
            Log.e(UUIDUtils.TAG, "空目录 检查文件读写权限是否已经给予 WRITE_EXTERNAL_STORAGE");
            return null;
        }
        List<String> s = new ArrayList<>();
        for (File value : files) {
            s.add(value.getName());
        }
        return s;
    }

    private static String getFilesName(Context context, String path) {
        List<String> files = getFilesAllName(context, path);
        String s = null;
        if (files != null && files.size() > 0) {
            s = files.get(files.size() - 1);
        }
        return s;
    }

    /**
     * UUID存储方式
     * UUID优先存储在SP和文件中，取出的顺序已文件稳准，但是文件需要权限如果文件没有值才会已SP为准
     * <p>
     * 1.判断Sp根据spKey获取是否已经存在内容，如果为空则写入新的值
     * 2.判断手机文件中是否存在UUID文件，如果取出来的值和sp相同则返回文件UUID,如果sp不同文件则将新的sp存入到文件中
     * 3.文件为空的情况
     *
     * @param uuid 设备唯一标识
     * @return uuid
     */
    @NotNull
    public static synchronized String saveUUID(Context context, String uuid) {
        String sp = (String) SharedPerferencesUtil.getInstance(context).getData(Constants.spKey, "");
        Log.e(TAG, "sp ===》" + sp);
        if (TextUtils.isEmpty(sp)) {
            //这里判空如果不存在sp保存内容则更新本地sp内容
            SharedPerferencesUtil.getInstance(context).putData(Constants.spKey, uuid);
            Log.e(TAG, "filePath make ===》" + uuid);
            mkdirs(context, Constants.filePath + uuid);
        } else {
            //不为空的时候直接用UUID
            String filename = getFilesName(context, Constants.filePath);
            Log.e(TAG, "fileName ===》" + filename);
            if (filename != null) {
                if (filename.equals(sp)) {
                    uuid = sp;
                    return uuid;
                } else {
                    //当有读写权限,且文件和sp文件不相同的时候使用sp文件去同步filename文件
                    uuid = filename;
                    SharedPerferencesUtil.getInstance(context).getData(Constants.spKey, uuid);

                    //此处如果文件写入的值跟sp不相同则已SP为准,则App实则为卸载在安装会重新生成.
//                    uuid = sp;
//                    FileUtil.mkdirs(Constants.filePath + uuid);
                }
            } else {
                //这里创建一个文件存储用来储存用户的UUID命名文件
                uuid = sp;
                mkdirs(context, Constants.filePath + uuid);
                Log.e(TAG, "UUID文件写入同时写入 写入到文件" + uuid);
            }
        }
        return uuid;
    }


    public static String getUUID(Context context) {
        String sp = (String) SharedPerferencesUtil.getInstance(context).getData(Constants.spKey, "");
        if (!TextUtils.isEmpty(sp)) {
            return sp;
        }
        String filename = getFilesName(context, Constants.filePath);
        if (filename != null) {
            return filename;
        }
        return UUIDUtils.getUniqueID(context);
    }
}
